#include "Slider.h"

#include <iostream>
Slider::Slider()
{
    min = 0 ;
    max = 100 ;
    position.x = position.y = 0;
    positionCurseur.x = position.y = 0;
    imageCurseur = IMG_Load("ressources/slider/curs.bmp");
    taille = 100;

    FondBouton f;
    f.image = IMG_Load("ressources/slider/defautFond.bmp");
    f.largeurDroite = f.largeurGauche = 2;
    fond.image = NULL;
    setFond(f);

    clicCurseur = false;
}

Slider::Slider(SDL_Rect position)
{
    min = 0 ;
    max = 100 ;
    this->position = position;
    positionCurseur = position;

    imageCurseur = IMG_Load("ressources/slider/curs.bmp");
    taille = 100;

    FondBouton f;
    f.image = IMG_Load("ressources/slider/defautFond.bmp");
    f.largeurDroite = f.largeurGauche = 2;
    fond.image = NULL;
    setFond(f);


    clicCurseur = false;

}

Slider::Slider(int min , int max , int taille ,SDL_Rect position)
{
    this->min = min ;
    this->max = max ;
    this->position = position;
    positionCurseur = position;
    imageCurseur = IMG_Load("ressources/slider/curs.bmp");
    this->taille = taille;

    FondBouton f;
    f.image = IMG_Load("ressources/slider/defautFond.bmp");
    f.largeurDroite = f.largeurGauche = 2;
    fond.image = NULL;
    setFond(f);


    clicCurseur = false;
}

Slider::~Slider()
{
    SDL_FreeSurface(imageCurseur);
}

void Slider::afficher(SDL_Surface *ecran  , SDL_Event event)
{
    //si on a un fond alors on va pouvoir afficher le fond
    if(fond.image != NULL)
    {
        //on recupere la position ou doit commencer l'affichage
        SDL_Rect positionFond = position;

        SDL_Rect posImage ;
        posImage.x = 0 ;
        posImage.y = 0;
        posImage.w = fond.largeurGauche;//on prend les valeur pour afficher la gauche
        posImage.h = fond.image->h;
        //on affiche l'image de la gauche
        SDL_BlitSurface(fond.image,&posImage,ecran,&positionFond);

        posImage.x +=  posImage.w;
        posImage.w = fond.image->w - fond.largeurGauche - fond.largeurDroite;//la largeur du centre de l'image a afficher
        //on va faire une boucle pour afficher le fond autant de foi qu'il faut
        positionFond.x += fond.largeurGauche;
        for(int i = 0 ; i < taille - fond.largeurGauche - fond.largeurDroite ; i+=posImage.w)
        {
            SDL_BlitSurface(fond.image,&posImage,ecran,&positionFond);
            positionFond.x += posImage.w ;
        }

        posImage.x += posImage.w;
        posImage.w = fond.largeurDroite;

        SDL_BlitSurface(fond.image,&posImage,ecran,&positionFond);
    }

    //apres l'affichage du curseur
    if(imageCurseur != NULL)
    {
        SDL_BlitSurface(imageCurseur,NULL,ecran,&positionCurseur);
    }

    //gestion des evenement
    int tailleCursX = 0 ;
    int tailleCursY = 0;

    switch(event.type)
    {
    case SDL_MOUSEBUTTONDOWN :
        if(imageCurseur != NULL)
        {
            tailleCursX = imageCurseur->w;
            tailleCursY = imageCurseur->h;
        }
        if(event.button.x > positionCurseur.x && event.button.x < positionCurseur.x + tailleCursX  && event.button.y > positionCurseur.y && event.button.y < positionCurseur.y + tailleCursY   )
            clicCurseur = true;
        else if(event.button.y > positionCurseur.y && event.button.y < positionCurseur.y + tailleCursY )
        {
            int tailleCurs = 0 , positionFinale = position.x;
            if(imageCurseur != NULL)
                tailleCurs = imageCurseur->w/2;

            if(event.button.x-tailleCurs <= position.x )
                positionCurseur.x = position.x - tailleCurs;
            else if(event.button.x-tailleCurs >= position.x + taille)
                positionCurseur.x = position.x - tailleCurs + taille;
            else
                positionCurseur.x = event.button.x-tailleCurs;


        }

        break;
    case SDL_MOUSEBUTTONUP:
        clicCurseur = false;
        break;
    case SDL_MOUSEMOTION:
        if(clicCurseur)
        {
            int tailleCurs = 0 , positionFinale = position.x;
            if(imageCurseur != NULL)
                tailleCurs = imageCurseur->w/2;

            if(event.button.x-tailleCurs <= position.x )
                positionCurseur.x = position.x - tailleCurs;
            else if(event.button.x-tailleCurs >= position.x + taille)
                positionCurseur.x = position.x - tailleCurs + taille;
            else
                positionCurseur.x = event.button.x-tailleCurs;
        }
        break;
    }
}


/***************** GETTER AND SETTER ***************/
SDL_Rect Slider::getPosition()
{
    return position;
}
void Slider::setPosition(SDL_Rect position)
{
    this->position = position;
}

int Slider::getMin()
{
    return min;
}
void Slider::setMin(int min )
{
    this->min = min;
}

int Slider::getMax()
{
    return max;
}
void Slider::setMax()
{
    this->max = max;

}
//getter pour connaitre la valeur du slide bar actuelement
int Slider::getValue()
{ double parpx = (double)(max-min)/(double)(taille);
    //le curseur et centre donc on doit rajouter un demi curseur
    double posCurs = positionCurseur.x  ;
    if(imageCurseur != NULL)
        posCurs += imageCurseur->w/2;
    posCurs -= position.x;

    return parpx*posCurs;

}

void Slider::setFond(FondBouton f)
{
    //  if(fond.image != NULL)
    //    SDL_FreeSurface(f.image);

    fond = f;
    if(fond.image != NULL && imageCurseur != NULL)
    {
        positionCurseur.y = position.y +(fond.image->h/2 - imageCurseur->h/2);
        positionCurseur.x = position.x - imageCurseur->w/2;
    }
}

void Slider::setCurseur(SDL_Surface *im)
{
    if(imageCurseur != NULL)
        SDL_FreeSurface(imageCurseur);
    imageCurseur = im;
}



